home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK2.toast / Development Kits (Disc 2) / QuickDraw 3D / Development / 3DMF parser / 1.0 version / MF3DMac / MFOBJTYP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-21  |  5.0 KB  |  186 lines  |  [TEXT/MPS ]

  1. /*==============================================================================
  2.  *
  3.  *    File:        MFOBJTYP.C
  4.  *
  5.  *    Function:    Object name/type lookup
  6.  *
  7.  *    Version:    Metafile:    Version 1.0 3DMF files
  8.  *                Package:    Release #2 of this code
  9.  *
  10.  *    Author(s):    Rick Wong (RWW), Duet Development Corp.
  11.  *                John Kelly (JRK), Duet Development Corp.
  12.  *
  13.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  14.  *
  15.  *    Change History (most recent first):
  16.  *        FB8_JRK    Segmentation
  17.  *        FB4_JRK    Parse object types we don't understand
  18.  *        Fabio    Changed file name to 8 characters
  19.  *        F2H_RWW    File created.
  20.  *==============================================================================
  21.  */
  22. #define    MF3D_Extern
  23. #include "MFOBJTYP.H"
  24. #undef    MF3D_Extern
  25.  
  26. #include <stdlib.h>
  27.  
  28. #include "MFERRORS.H"
  29. #include "MFOBJCTS.H"
  30. #include "MFTYPES.H"
  31. #include "MFASSERT.H"
  32. #include "MFINTOBJ.H"
  33. #include "MFTEXTRD.H"
  34. #include "MFTEXTUT.H"
  35.  
  36. #if defined(applec) || defined(__MWERKS__) || defined(THINK_C)
  37. #pragma segment __MF3D__
  38. #endif
  39.  
  40.  
  41. /* FB5_JRK
  42.  * We use the following string to help us parse unknown objects in a text file.
  43.  * It is set by MF3D_FindObjectFromName and used in MF3D_ConvertUserDefinedObjType
  44.  * to return an object name to stuff into the object. It is a HACK (!) that
  45.  * relies on no other failed calls to MF3D_FindObjectFromName before calling
  46.  * MF3D_ConvertUserDefinedObjType. It works, but thought you might want to know.
  47.  */
  48. static char gLastUnknownObjectName[kMF3D_MaxObjNameLength] = "";
  49.  
  50.  
  51. /*==============================================================================
  52.  *    MF3D_FindObjectFromName
  53.  *
  54.  *    Get the object stuff, given the object name
  55.  *==============================================================================
  56.  */
  57. MF3DErr
  58. MF3D_FindObjectFromName(
  59.     const char            *inObjName,
  60.     MF3D_ObjStuffPtr    *outObjStuffPtr,
  61.     MF3DObjType            *outObjectType)
  62. {
  63.     MF3DErr                result;
  64.  
  65.     result = kMF3DNoErr;
  66.  
  67.     if (inObjName[0] == '-')
  68.     {    MF3DInt32    objType;
  69.  
  70.         objType = atoi(inObjName);
  71.  
  72.         if (objType >= 0)
  73.             result = kMF3DErrIllegalObjName;
  74.         else
  75.         {    *outObjStuffPtr = &gMF3D_UnknownObjStuffTable;
  76.             MFASSERT(sizeof(*outObjectType) == sizeof(objType));
  77.             *outObjectType = objType;
  78.         }
  79.     }
  80.     else
  81.     {    MF3D_ObjStuffPtr    objStuffPtr;
  82.  
  83.         objStuffPtr = gMF3D_ObjStuffTable;
  84.         do
  85.         {    if (MF3D_CompareObjNames(inObjName, objStuffPtr->name) == 0)
  86.             {    *outObjStuffPtr = objStuffPtr;
  87.                 break;
  88.             }
  89.             ++objStuffPtr;
  90.         } while (objStuffPtr->type != kMF3DObjInvalid);
  91.  
  92.         /* FB5_JRK */
  93.         /* Remember object name on error and pass back special object stuff */
  94.         if (objStuffPtr->type == kMF3DObjInvalid)
  95.         {    *outObjStuffPtr = &gMF3D_UnknownObjStuffTable;
  96.             *outObjectType = kMF3DObjUnknownType;
  97.             strncpy(gLastUnknownObjectName, inObjName, kMF3D_MaxObjNameLength);
  98.             gLastUnknownObjectName[kMF3D_MaxObjNameLength - 1] = '\0';
  99.             result = kMF3DErrIllegalObjName;
  100.         }
  101.         else
  102.             *outObjectType = objStuffPtr->type;
  103.  
  104.     }
  105.  
  106.     return result;
  107. }
  108.  
  109. /*==============================================================================
  110.  *    MF3D_FindObjectFromType
  111.  *
  112.  *    Get the object stuff, given the object type
  113.  *==============================================================================
  114.  */
  115. MF3DErr
  116. MF3D_FindObjectFromType(
  117.     MF3DObjType            inObjType,
  118.     MF3D_ObjStuffPtr    *outObjStuffPtr)
  119. {
  120.     MF3DErr                result;
  121.  
  122.     result = kMF3DNoErr;
  123.  
  124.     /* FB4_JRK */
  125.     /* Return unknown object stuff if we don't know the type of object */
  126.     *outObjStuffPtr = &gMF3D_UnknownObjStuffTable;
  127.  
  128.     /* Look through standard table if not a user-defined type */
  129.     if (inObjType >= 0)
  130.     {    MF3D_ObjStuffPtr    objStuffPtr;
  131.  
  132.         objStuffPtr = gMF3D_ObjStuffTable;
  133.         do
  134.         {    if (inObjType == objStuffPtr->type)
  135.             {    *outObjStuffPtr = objStuffPtr;
  136.                 break;        /* ### NORMAL LOOP EXIT ### */
  137.             }
  138.             ++objStuffPtr;
  139.         } while (objStuffPtr->type != kMF3DObjInvalid);
  140.         if (objStuffPtr->type == kMF3DObjInvalid)
  141.             result = kMF3DErrIllegalObjName;
  142.     }
  143.  
  144.     return result;
  145. }
  146.  
  147. /*==============================================================================
  148.  *    ConvertUserDefinedObjType
  149.  *
  150.  *    Negative numbers are user-defined object types.
  151.  *    Verify that this one exists.
  152.  *==============================================================================
  153.  */
  154. MF3DErr
  155. MF3D_ConvertUserDefinedObjType(
  156.     MF3D_FilePtr    inMetafilePtr,
  157.     MF3DObjType        inObjType,
  158.     MF3DCStringPtr    *outObjName)
  159. {
  160.     MF3DUns32            numTypes;
  161.     MF3D_TypeListPtr    typeListPtr;
  162.     MF3DErr                result;
  163.  
  164.     /* Assume we will not find what we are looking for */
  165.     result = kMF3DErrIllegalObjName;
  166.  
  167.     /* FB5_JRK */
  168.     /* Return last unknown name if we get unknown type */
  169.     if (inObjType == kMF3DObjUnknownType)
  170.         *outObjName = MF3D_DuplicateCString(gLastUnknownObjectName);
  171.     else
  172.     {    typeListPtr = inMetafilePtr->typeTable.types;
  173.         for (numTypes = inMetafilePtr->typeTable.nTypes;
  174.                 result != kMF3DNoErr && numTypes > 0;
  175.                 --numTypes, ++typeListPtr)
  176.         {    MFASSERT(sizeof(inObjType) == sizeof(typeListPtr->number));
  177.             if (inObjType == (MF3DObjType)typeListPtr->number)
  178.             {    *outObjName = MF3D_DuplicateCString(typeListPtr->name);
  179.                 result = kMF3DNoErr;    /* ### REAL LOOP EXIT ### */
  180.             }
  181.         }
  182.     }
  183.  
  184.     return result;
  185. }
  186.